//package com.jackson0714.passjava.gateway.config;
//
//import io.netty.buffer.ByteBufAllocator;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.core.Ordered;
//import org.springframework.core.io.buffer.DataBuffer;
//import org.springframework.core.io.buffer.DataBufferUtils;
//import org.springframework.core.io.buffer.NettyDataBufferFactory;
//import org.springframework.http.HttpMethod;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
//import org.springframework.stereotype.Component;
//import org.springframework.util.MultiValueMap;
//import org.springframework.web.server.ServerWebExchange;
//import reactor.core.publisher.Flux;
//import reactor.core.publisher.Mono;
//
//import java.net.URI;
//import java.nio.CharBuffer;
//import java.nio.charset.StandardCharsets;
//import java.util.concurrent.atomic.AtomicReference;
//
///**
//  * @Description:请求全局过滤器
//  * 所有请求都会执行,可拦截get、post等请求做逻辑处理
//  * @Version v1.0.0
//  * @author zhangpeng148
//  * @date 2022/1/14 16:27
//  */
//@Component
//@Slf4j
//public class RequestGlobalFilter implements GlobalFilter, Ordered {
//
//    /** todo
//     * 过滤器中的 Body 只能被读取一次，读取后之后在就读取不到了（坑爹）
//     * 由于异步问题，直接获取参数内容可能会为空，并且不同的 SpringBoot 版本，有的能获取到，有的获取不到（坑爹的异步）
//     * 由于异步问题，参数采用消费的模式，一但被读取使用后，后续就将无法再次读取到
//     *
//     * @param: [exchange, chain]
//     * @return: reactor.core.publisher.Mono<java.lang.Void>
//     */
//    @Override
//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        ServerHttpRequest request = exchange.getRequest();
//        String uriStr = request.getURI().toString();
//        log.info("当前请求URI:{}",uriStr);
//        //当前请求方式
//        String methodValue = request.getMethodValue();
//        //post请求方式逻辑
//        if(HttpMethod.POST.toString().equals(methodValue)){
//            //从请求中获取请求体
//            String bodyParam = resolveBodyFromRequest(request);
//            log.info("RequestGlobalFilter获取post的请求参数为：{}",bodyParam);
//            //todo 这里拿到数据可以做你想做的逻辑
//
//            //下面的将请求体再次封装写回到request里，传到下一级，否则，由于请求体已被消费，后续的服务将取不到值
//            URI uri= request.getURI();
//            ServerHttpRequest serverHttpRequest = request.mutate().uri(uri).build();
//            DataBuffer bodyDataBuffer= stringBuffer(bodyParam);
//            if(null != bodyDataBuffer){
//                Flux<DataBuffer> just = Flux.just(bodyDataBuffer);
//                serverHttpRequest = new ServerHttpRequestDecorator(serverHttpRequest){
//                    @Override
//                    public Flux<DataBuffer> getBody() {
//                        return just;
//                    }
//                };
//            }
//            //封装request，传给下一级
//            return chain.filter(exchange.mutate().request(serverHttpRequest).build());
//
//        }else if(HttpMethod.GET.toString().equals(methodValue)){
//            //get请求方式逻辑  获取到get请求的报文
//            MultiValueMap<String, String> queryParams = request.getQueryParams();
//            //todo 可以做一些逻辑处理
//            return chain.filter(exchange);
//        }
//        return chain.filter(exchange);
//    }
//
//    /**
//     * 转换数据
//     *
//     * @param: [bodyParam]
//     * @return: org.springframework.core.io.buffer.DataBuffer
//     */
//    private DataBuffer stringBuffer(String bodyParam) {
//        if(StringUtils.isNotBlank(bodyParam)){
//            byte[] bytes = bodyParam.getBytes(StandardCharsets.UTF_8);
//            NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
//            DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
//            buffer.write(bytes);
//            return buffer;
//        }
//        return null;
//    }
//
//    /**
//     * 从请求中获取body的数据
//     *  todo 由于异步的问题直接获取参数有可能会为空  并且不同的 SpringBoot 版本，有的能获取到，有的获取不到
//     * @param: [request]
//     * @return: java.lang.String
//     */
//    private String resolveBodyFromRequest(ServerHttpRequest request) {
//        Flux<DataBuffer> body = request.getBody();
//        AtomicReference<String> bodyRef = new AtomicReference<>();
//        body.subscribe(dataBuffer -> {
//            CharBuffer charBuffer = StandardCharsets.UTF_8.decode(dataBuffer.asByteBuffer());
//            DataBufferUtils.release(dataBuffer);
//            bodyRef.set(charBuffer.toString());
//        });
//        //获取request body
//        return bodyRef.get();
//    }
//
//    // 执行顺序
//    @Override
//    public int getOrder() {
//        return 1;
//    }
//}
